package com.trailwalker.JavaUtils.file;

import java.io.*;
import java.nio.charset.StandardCharsets;

/**
 * @author Trailwalker
 * @create 2021-09-15 11:38
 * @des
 */
public class FileUtils {

    public static String[] IMAGE_EXTENSION_ARRAY = {".png", ".PNG", ".jpg", ".gif"};

    public static File getFile(String pathName) {
        File file = new File(pathName);
        return file;
    }

    /**
     * 获取绝对路径
     *
     * @param file
     * @return
     */
    public static String getAbsolutePath(File file) {
        if (file != null) {
            return file.getAbsolutePath();
        } else {
            return null;
        }
    }

    /**
     * 获取路径
     *
     * @param file
     * @return
     */
    public static String getPath(File file) {
        if (file != null) {
            return file.getPath();
        } else {
            return null;
        }
    }

    /**
     * 获取文件名
     *
     * @param file
     * @return
     */
    public static String getName(File file) {
        if (file != null) {
            return file.getName();
        } else {
            return null;
        }
    }

    /**
     * 获取上层文件目录路径，若无，返回null
     *
     * @param file
     * @return
     */
    public static String getParent(File file) {
        if (file != null) {
            return file.getParent();
        } else {
            return null;
        }
    }

    /**
     * 获取文件长度（即：字节数） 不能获取目录的长度
     */
    public static long length(File file) {
        if (file != null) {
            return file.length();
        } else {
            return 0;
        }
    }

    /**
     * 获取最后一次的修改时间，毫秒值
     *
     * @param file
     * @return
     */
    public static long lastModified(File file) {
        if (file != null) {
            return file.lastModified();
        } else {
            return 0;
        }
    }

    /**
     * 获取指定目录下的所有文件或者文件目录的名称数组
     *
     * @param file
     * @return
     */
    public static String[] list(File file) {
        if (file != null) {
            return file.list();
        } else {
            return null;
        }
    }

    /**
     * 获取指定目录下的所有文件或者文件目录的File数组
     *
     * @param file
     * @return
     */
    public static File[] listFiles(File file) {
        if (file != null) {
            return file.listFiles();
        } else {
            return null;
        }
    }

    /**
     * 获取指定目录下的所有文件或者文件目录的File数组
     *
     * @param file
     * @return
     */
    public static File[] listFiles(File file, FilenameFilter filter) {
        if (file != null) {
            return file.listFiles(filter);
        } else {
            return null;
        }
    }

    /**
     * 是否是图片
     *
     * @param name
     * @return
     */
    public static boolean isImage(String name) {
        for (int i = 0; i < IMAGE_EXTENSION_ARRAY.length; i++) {
            String imageExtension = IMAGE_EXTENSION_ARRAY[i];
            if (name.endsWith(imageExtension)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据不带有扩展名的图片文件名，获取图片文件
     *
     * @param dirPath
     * @param imageFileName
     * @return
     */
    public static File getImageFileByFileNameWithoutExtension(String dirPath, String imageFileName) {
        for (int i = 0; i < IMAGE_EXTENSION_ARRAY.length; i++) {
            String imageExtension = IMAGE_EXTENSION_ARRAY[i];
            File file = getFile(dirPath + File.separator + imageFileName + imageExtension);
            if (file.exists()) {
                return file;
            }
        }
        return null;
    }

    /**
     * 把文件重命名为指定文件路径
     * 要想返回true 需要保证srcFile在硬盘中是存在的，toFile是不存在的
     *
     * @param srcFile
     * @param toFile
     * @return
     */
    public static boolean renameTo(File srcFile, File toFile) {
        if (srcFile != null) {
            boolean isRight = srcFile.renameTo(toFile);
            return isRight;
        } else {
            return false;
        }
    }

    /**
     * 判断是否是文件目录
     *
     * @param file
     * @return
     */
    public static boolean isDirectory(File file) {
        if (file != null) {
            return file.isDirectory();
        } else {
            return false;
        }
    }

    /**
     * 判断是否是文件
     *
     * @param file
     * @return
     */
    public static boolean isFile(File file) {
        if (file != null) {
            return file.isFile();
        } else {
            return false;
        }
    }

    /**
     * 判断是否存在
     *
     * @param file
     * @return
     */
    public static boolean exists(File file) {
        if (file != null) {
            return file.exists();
        } else {
            return false;
        }
    }

    /**
     * 判断是否是可读
     *
     * @param file
     * @return
     */
    public static boolean canRead(File file) {
        if (file != null) {
            return file.canRead();
        } else {
            return false;
        }
    }

    /**
     * 判断是否可写
     *
     * @param file
     * @return
     */
    public static boolean canWrite(File file) {
        if (file != null) {
            return file.canWrite();
        } else {
            return false;
        }
    }

    /**
     * 判断是否隐藏
     *
     * @param file
     * @return
     */
    public static boolean isHidden(File file) {
        if (file != null) {
            return file.isHidden();
        } else {
            return false;
        }
    }

    /**
     * 创建文件 若文件存在，则不创建，返回false
     *
     * @param file
     * @return
     */
    public static boolean createNewFile(File file) {
        if (file != null) {
            boolean isSuccess = false;
            try {
                isSuccess = file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return isSuccess;
        } else {
            return false;
        }
    }

    /**
     * 创建文件目录 若文件目录存在，则不创建；如果此文件目录的上层目录不存在，也不创建
     *
     * @param file
     * @return
     */
    public static boolean mkdir(File file) {
        if (file != null) {
            boolean isSuccess = file.mkdir();
            return isSuccess;
        } else {
            return false;
        }
    }

    /**
     * 创建文件目录 如果上层文件目录不存在，一并创建
     *
     * @param file
     * @return
     */
    public static boolean mkdirs(File file) {
        if (file != null) {
            boolean isSuccess = file.mkdirs();
            return isSuccess;
        } else {
            return false;
        }
    }

    /**
     * 删除磁盘中的文件或文件目录
     * java中的删除不走回收站
     *
     * @param file
     * @return
     */
    public static boolean delete(File file) {
        if (file != null) {
            boolean isSuccess = file.delete();
            return isSuccess;
        } else {
            return false;
        }
    }

    //读取json文件
    public static String readJsonFile(String fileName) {
        String jsonStr;
        try {
            File jsonFile = new File(fileName);
            FileReader fileReader = new FileReader(jsonFile);
            Reader reader = new InputStreamReader(new FileInputStream(jsonFile), StandardCharsets.UTF_8);
            int ch;
            StringBuilder stringBuilder = new StringBuilder();
            while ((ch = reader.read()) != -1) {
                stringBuilder.append((char) ch);
            }
            fileReader.close();
            reader.close();
            jsonStr = stringBuilder.toString();
            return jsonStr;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String getProjectDir() {
        return System.getProperty("user.dir");
    }

}
